using System.Runtime.InteropServices;


namespace yk
{
    public static class GlobalDM
    {
        // 不注册调用大漠插件，实际上是使用 dmreg.dll 来配合实现，这个文件有 2 个导出接口 SetDllPathW 和 SetDllPathA。 SetDllPathW 对应 unicode，SetDllPathA 对应 ascii 接口。
        [DllImport(@"./libs/ykreg.dll")]
        private static extern int SetDllPathW(string path, int mode);
        [DllImport(@"./libs/ykreg.dll")]
        private static extern int SetDllPathA(string path, int mode);

        // 定义全局变量
        public static Ykdamo? DM;
        public static bool dm_available = false;
        public static bool dm_registered = false;
        public static string dm_info = "";
        public static int bindedWindow = -1;

        /// <summary>
        /// 免注册调用大漠插件
        /// </summary>
        /// <returns></returns>
        public static bool RegisterDmSoftDll()
        {
            var setDllPathResult = SetDllPathA(@"./libs/yk.dll", 0);  // 第二个参数为0表示STA，1表示MTA，就是dm.dll文件
            if (setDllPathResult == 0)  // 结果为0表示未知错误的失败，可能是线程模式不对，调整第二个参数重试
            {
                // 加载 dm.dll 失败
                setDllPathResult = SetDllPathA(@"./libs/yk.dll", 1);
                if (setDllPathResult == 0)
                {
                    return false;
                }
                else
                {
                    return true;
                }
            }

            return true;
        }
    }
    internal class Program
    {
        private static void Main(string[] args)
        {
            if (Environment.Is64BitProcess)
            {
                GlobalDM.dm_info = "error:ykdamo只能以32位程序模式运行，当前为64位，程序已退出";
            }

            // 免注册调用大漠插件
            var registerDmSoftDllResult = GlobalDM.RegisterDmSoftDll();
            if (registerDmSoftDllResult)
            {
                GlobalDM.DM = new Ykdamo();
                GlobalDM.dm_available = true;
            }
            else
            {
                GlobalDM.dm_info = "error:ykdamo com组件注册失败，可能是线程模式的问题或者dll路径编码的问题";
                GlobalDM.dm_available = false;
            }

            var builder = WebApplication.CreateBuilder(args);

            // Add services to the container.

            builder.Services.AddControllers();
            // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
            builder.Services.AddEndpointsApiExplorer();
            builder.Services.AddSwaggerGen(c =>  // 配置Swagger，使控制器的注释可以显示在网页上
            {
                c.SwaggerDoc("v1", new Microsoft.OpenApi.Models.OpenApiInfo
                {
                    Title = "WebDM",
                    Version = "v1",
                    Description = "通过该接口可以调用大漠插件的功能",
                });
                var file = Path.Combine(AppContext.BaseDirectory, "WebDM.xml");
                var path = Path.Combine(AppContext.BaseDirectory, file);
                c.IncludeXmlComments(path, true);
                //c.OrderActionsBy(o => o.RelativePath); // 对Swagger UI展示的接口进行排序

            });

            var app = builder.Build();

            app.UseSwagger();
            app.UseSwaggerUI();

            app.UseAuthorization();

            app.MapControllers();

            //app.Urls.Add("http://localhost:5000"); // 可以覆盖配置文件中的访问地址，这里不覆盖，则以配置文件为准，灵活性较高，但是下方的提示无法获得配置文件中的端口，因为不同运行方式配置文件可能不同
            // 例如调试时，可能使用配置文件IIS Express，发布时可能使用配置文件Kestrel，或者直接在命令行中指定端口。不管怎样，服务工具都会在控制台中输出实际使用的访问端口号，这里不写死。
            Console.WriteLine("http://localhost:8765/swagger/index.html");
            Console.WriteLine("http://localhost:{port}/swagger/index.html");
            app.Run();
        }
    }
}